package com.fdb.efp.batch.service.impl.dw;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.fdb.basic.framework.core.constant.CountryConstant;
import com.fdb.basic.framework.core.constant.CurrencyConstant;
import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.constant.SDicCertTypeEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.basic.framework.core.util.StringUtil;
import com.fdb.basic.framework.core.util.ValidationUtils;
import com.fdb.efp.batch.common.constant.BdLoanConstant;
import com.fdb.efp.batch.service.domain.TxtFileLoadBean;
import com.fdb.efp.batch.service.domain.dw.BdSxapplyBean;
import com.fdb.efp.batch.service.facade.dw.BdSxApplyBatchService;
import com.fdb.efp.batch.service.util.DueDataUtil;
import com.fdb.efp.batch.service.util.SDicMappingUtil;
import com.fdb.efp.batch.service.util.TxtFileLoadPlugin;
import com.fdb.efp.esb.common.constant.MsLoanConstant;
import com.fdb.efp.loan.service.facade.AccoutErroTempService;
import com.fdb.efp.loan.service.vo.AccoutErroTempVO;
import com.fdb.efp.nls.service.facade.sx.NlsCreditInfoService;
import com.fdb.efp.nls.service.vo.sx.NlsCreditInfoVO;

/**
 * 
 * 二阶段百度数据移植-数据移植-授信申请信息同步 <br>
 * 根据ODS卸载的实时进件-授信申请信息同步到授信申请信息<br>
 * 
 * @author ludayong
 * @since 2019年5月7日 上午9:51:52
 * @version 1.0
 */
@Service("bdSxApplyBatchService")
public class BdSxApplyBatchServiceImpl implements BdSxApplyBatchService {

	private static Logger logger = LoggerFactory.getLogger(BdSxApplyBatchServiceImpl.class);

	@Autowired
	@Qualifier("nlsCreditInfoService")
	private NlsCreditInfoService nlsCreditInfoService;// 授信申请基本信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 同步文件记录异常信息

	/**
	 * 
	 * 根据存量的实时进件-授信申请信息同步到授信申请信息 <br>
	 * 0.1:ludayong:2019年5月7日 上午10:00:36:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月7日 上午10:00:36
	 * @date 2019年5月7日 上午10:00:36
	 * @version 0.1
	 */
	@Override
	public boolean batchSyncSxApply(String fileUrl) throws Exception {
		// 处理结果
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步实时进件-授信申请信息同步到授信申请信息表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		try {
			TxtFileLoadPlugin txtFileLoadPlugin = new TxtFileLoadPlugin(fileUrl, "\u0002", "UTF-8", 0, 1000);
			List<TxtFileLoadBean> txtFileLoadList = txtFileLoadPlugin.run(new BdSxapplyBean());
			result = dueData(txtFileLoadList);
			if (txtFileLoadList.size() != 0) {
				while (!txtFileLoadList.get(txtFileLoadList.size() - 1).isReadedComplete) {
					txtFileLoadPlugin.setFirstRead(false);
					txtFileLoadList = txtFileLoadPlugin.run(new BdSxapplyBean());
					if (txtFileLoadList.size() == 0) {
						break;
					}
					result = dueData(txtFileLoadList);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "nls_credit_info";
			String errorMsg = "同步实时进件-授信申请信息同步到授信申请信息出错";
			String remark = "同步实时进件-授信申请信息同步到授信申请信息出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步实时进件-授信申请信息同步到授信申请信息表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步实时进件-授信申请信息同步到授信申请信息表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 根据存量的实时进件-授信申请文件数据信息加工初始化授信申请信息 <br>
	 * 0.1:ludayong:2019年5月13日 上午9:08:10:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月13日 上午9:08:10
	 * @date 2019年5月13日 上午9:08:10
	 * @version 0.1
	 */
	public boolean dueData(List<TxtFileLoadBean> txtFileLoadList) {
		logger.info("同步实时进件-授信申请信息同步到授信申请信息表加工处理开始！");
		// 需要新增或者更新的网贷授信申请信息
		List<NlsCreditInfoVO> nlsCreditInfoList = new ArrayList<NlsCreditInfoVO>();
		// 处理结果
		boolean result = false;
		// 新增或者修改的授信申请信息数量
		int nlsCreditInfoNum = 0;
		try {
			for (int i = 0; i < txtFileLoadList.size(); i++) {
				BdSxapplyBean bdSxapplyBean = (BdSxapplyBean) txtFileLoadList.get(i);
				// 需要新增或者更新的网贷授信申请信息
				NlsCreditInfoVO nlsCreditInfoVo = initNlsCreditDetailInfo(bdSxapplyBean);
				if (Objects.nonNull(nlsCreditInfoVo)) {
					nlsCreditInfoList.add(nlsCreditInfoVo);
				}
			}
			// 需要新增或者更新的网贷授信申请信息
			if (Objects.nonNull(nlsCreditInfoList) && !nlsCreditInfoList.isEmpty()) {
				// 新增或者更新网贷授信申请信息
				nlsCreditInfoNum = nlsCreditInfoService.insertOrUpdateNlsCreditInfo(nlsCreditInfoList);
			}
			String num_msg1 = "【授信申请信息表】插入或更新数据处理结果:" + nlsCreditInfoNum;
			logger.info(num_msg1, "message{}");
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "nls_credit_info";
			String errorMsg = "同步实时进件-授信申请信息同步到网贷系统授信申请信息出错";
			String remark = "同步实时进件-授信申请信息同步到网贷系统授信申请信息出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		} finally {
			// 清空信息
			nlsCreditInfoList = null;
			txtFileLoadList = null;
		}
		logger.info("同步存量的贷款利息汇率临时表数据到费率表加工处理结束！");
		return result;
	}

	/**
	 * 
	 * 初始化授信申请详细信息 <br>
	 * 0.1:ludayong:2019年5月7日 上午10:52:04:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月7日 上午10:52:04
	 * @date 2019年5月7日 上午10:52:04
	 * @version 0.1
	 */
	public NlsCreditInfoVO initNlsCreditDetailInfo(BdSxapplyBean bdSxapplyBean) {
		// 新增或者修改的授信申请详细信息
		NlsCreditInfoVO nlsCreditInfoVo = new NlsCreditInfoVO();
		try {
			// lmt_apply_seq 授信申请流水号 SESSIONID 通用字段-会话ID
			nlsCreditInfoVo.setLmtApplySeq(bdSxapplyBean.getSessionid());
			// pre_lmt_apply_seq 预授信流水号
			// bd_req_sn 请求方需要保证永远唯一响应方据此判断是否重复请求 REQSN 通用字段-唯一
			nlsCreditInfoVo.setBdReqSn(bdSxapplyBean.getReqsn());
			// bd_transaction_id 事务ID，贯穿 授信、用信 TRANSACTIONID 通用字段-事务ID
			nlsCreditInfoVo.setBdTransactionId(bdSxapplyBean.getTransactionid());
			// cus_id 客户号
			// cus_name 客户名称 NAME 通用字段-真实姓名
			nlsCreditInfoVo.setCusName(bdSxapplyBean.getName());
			// cert_type 证件类型 10100 居民身份证
			nlsCreditInfoVo.setCertType(SDicCertTypeEnum.IDCARD.getValue());
			// cert_code 证件号码 PRCID 通用字段-身份证号
			nlsCreditInfoVo.setCertCode(bdSxapplyBean.getPrcid());
			// cert_addr 证件地址
			// cert_end_dt 证件有效期
			// recv_account 银行卡号 BANKCARD 通用字段-银行卡号
			nlsCreditInfoVo.setRecvAccount(bdSxapplyBean.getBankcard());
			// gender 性别
			if (!StringUtil.isNullorBank(bdSxapplyBean.getPrcid())) {
				String gender = "";
				try {
					gender = ValidationUtils.getSexFromIdNumber(bdSxapplyBean.getPrcid()).getEnname();
					nlsCreditInfoVo.setGender(gender);
				} catch (Exception e) {
					nlsCreditInfoVo.setGender(gender);
					// e.printStackTrace();
					// logger.error("从证件号码中获取客户性别出错，异常信息：" + e.getMessage());
				}
			}
			// national 国籍 CHN 中国
			nlsCreditInfoVo.setNational(CountryConstant.CHN);
			// profession 职业
			// indiv_rsd_addr 联系地址
			// lmt_type 额度类型 ICODE 百度分配的机构码
			nlsCreditInfoVo.setLmtType(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.LMT_TYPE, bdSxapplyBean.getIcode()));
			// cyclic_flg 是否循环 ICODE 百度分配的机构码
			nlsCreditInfoVo.setCyclicFlg(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.CYCLIC_FLG, bdSxapplyBean.getIcode()));
			// prd_id 产品ID ICODE 百度分配的机构码
			nlsCreditInfoVo.setPrdId(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_CODE, bdSxapplyBean.getIcode()));
			// prd_code 产品代码 ICODE 百度分配的机构码
			nlsCreditInfoVo.setPrdCode(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_CODE, bdSxapplyBean.getIcode()));
			// prd_name 产品名称 ICODE 百度分配的机构码
			nlsCreditInfoVo.setPrdName(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_NAME, bdSxapplyBean.getIcode()));
			// case_code 专案编号
			// case_name 专案名称
			// apply_amt 申请金额 INITAILAMOUNT 百度授信额度
			if (!StringUtil.isNullorBank(bdSxapplyBean.getInitailamount())) {
				// 单位转换待定
				nlsCreditInfoVo.setApplyAmt(new BigDecimal(bdSxapplyBean.getInitailamount()));
			}
			// avb_amt 可用额度
			// apply_term 默认9999
			nlsCreditInfoVo.setApplyTerm(BdLoanConstant.DAY_9999);
			// term_type 期限类型 赋值：D日
			nlsCreditInfoVo.setTermType(BdLoanConstant.TERM_TYPE_D);
			// apply_rate_y 申请执行年利率%
			// approve_rate_y 批复执行年利率%
			// assure_means_main 担保方式
			// assure_means2 担保方式2
			// assure_means3 担保方式3
			// currency_type 币种 赋值：CNY人民币
			nlsCreditInfoVo.setCurrencyType(CurrencyConstant.CNY);
			// repayment_mode 还款方式
			// repayment_period 还款周期
			// repayment_period_type 还款周期单位
			// repayment_day_type 还款日类型
			// repayment_day 还款日
			// loan_use_type 贷款用途 23 消费支出
			nlsCreditInfoVo.setLoanUseType(BdLoanConstant.LOAN_USE_TYPE_23);
			// cus_manager 客户经理
			// apprv_id 审批人
			// apprv_date 审批日期
			// apprv_sts 审批状态 ISBLACK 初始为NULL,0-没有黑名单 1-有黑名单
			String apprvSts = SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.NLS_APPLY_STATE, bdSxapplyBean.getIsblack());
			nlsCreditInfoVo.setApprvSts(apprvSts);
			if (StringUtil.isNullorBank(bdSxapplyBean.getIsblack())) {
				apprvSts = MsLoanConstant.NlsApplyStateEnum.PASS.VALUE;
				nlsCreditInfoVo.setApprvSts(MsLoanConstant.NlsApplyStateEnum.PASS.VALUE);
			}
			// 审批通过
			if (MsLoanConstant.NlsApplyStateEnum.PASS.VALUE.equals(apprvSts)) {
				// approve_amt 审批金额(元) 审批通过赋：申请金额 INITAILAMOUNT 百度授信额度
				if (!StringUtil.isNullorBank(bdSxapplyBean.getInitailamount())) {
					// 单位转换待定
					nlsCreditInfoVo.setApproveAmt(new BigDecimal(bdSxapplyBean.getInitailamount()));
				}
				// approve_term 批复期限 审批之后的期限
				// nlsCreditInfoVo.setApproveTerm(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.APPLY_TERM,
				// bdSxapplyTempVO.getIcode()));
			}
			// apply_date 申请日期 inputdate 录入日期
			nlsCreditInfoVo.setApplyDate(DueDataUtil.getApplyDateValue(bdSxapplyBean.getTrantime(), BdLoanConstant.NO_0));
			// act_sts 激活状态
			// is_cre_info 是否同意查征信
			// reject_reason 拒绝原因
			// channel_no 渠道编号
			nlsCreditInfoVo.setChannelNo(BdLoanConstant.BD_CHANNEL_NO);

			final String createUser = "admin";
			// create_user 创建人
			nlsCreditInfoVo.setCreateUser(createUser);
			// create_time 创建时间
			nlsCreditInfoVo.setCreateTime(DueDataUtil.getApplyDateValue(bdSxapplyBean.getTrantime(), BdLoanConstant.YES_1));
			// last_update_user 最后修改人
			nlsCreditInfoVo.setLastUpdateUser(createUser);
			// last_update_time 最后修改时间
			nlsCreditInfoVo.setLastUpdateTime(DateTool.getCurrentDateTime());
			// indiv_mobile 手机号码 PHONENUMBER 通用字段-手机号
			nlsCreditInfoVo.setIndivMobile(bdSxapplyBean.getPhonenumber());
			// nls_oper_userid 网贷经办人
			// nls_oper_orgid 网贷经办机构
			// bd_reason_code 百度原因码 REASONCODE 百度原因码
			nlsCreditInfoVo.setBdReasonCode(bdSxapplyBean.getReasoncode());
			// bd_reason_msg 百度原因码说明 REASONMSG 百度原因码说明
			nlsCreditInfoVo.setBdReasonMsg(bdSxapplyBean.getReasonmsg());
			// bd_ris_code 百度策略码 RISCODE 百度策略码
			nlsCreditInfoVo.setBdRisCode(bdSxapplyBean.getRiscode());
			// ethnic 民族
			// edu 学历
			// wrk_corp_nm 工作单位名称
			// wrk_corp_addr 工作单位地址
			// mrg_situ 婚姻状况
			// sps_nm 配偶姓名
			// ttl 职称
			// bd_income 月收入（区间） TAXMONTHLYINCOMESECTION 税后月收入（区间）
			// 单位转换待定
			nlsCreditInfoVo.setBdIncome(bdSxapplyBean.getTaxmonthlyincomesection());
			// bd_pre_cust_seg 人群分层 PREACUSTSEG 人群分层
			nlsCreditInfoVo.setBdPreCustSeg(bdSxapplyBean.getPreacustseg());
			// bd_dxm_score 度小满A模型分
			// bd_holmes_black_score 关联黑产分 HOLMESBLACKSCORE 关联黑产分
			nlsCreditInfoVo.setBdHolmesBlackScore(bdSxapplyBean.getHolmesblackscore());
			// bd_holmes_agent_score 关联中介分 HOLMESAGENTSCORE 关联中介分
			nlsCreditInfoVo.setBdHolmesAgentScore(bdSxapplyBean.getHolmesagentscore());
			// bd_black_list_type 黑名单类型 BLACKLISTTYPE 黑名单类型
			nlsCreditInfoVo.setBdBlackListType(bdSxapplyBean.getBlacklisttype());
			// bd_prcid_normal_score_exp3 内部多头分（身份证） PRCIDNORMALSCOREEXP3 内部多头分（身份证）
			nlsCreditInfoVo.setBdPrcidNormalScoreExp3(bdSxapplyBean.getPrcidnormalscoreexp3());
			// bd_bid_normal_score_exp3 内部多头分（百度帐号） BIDNORMALSCOREEXP3 内部多头分（百度帐号）
			nlsCreditInfoVo.setBdBidNormalScoreExp3(bdSxapplyBean.getBidnormalscoreexp3());
			// bd_phone_normal_score_exp3 内部多头分（手机） PHONENORMALSCOREEXP3 内部多头分（手机）
			nlsCreditInfoVo.setBdPhoneNormalScoreExp3(bdSxapplyBean.getPhonenormalscoreexp3());
			// bd_Int_income12 等额本金12期利息（循环产品）
			// global_serno 全局流水号
			// solt_code 当前插槽代码
			// solt_name 当前插槽名称
			// rsp_code 响应码
			// rsp_msg 响应信息
			// solt_result_details 插槽结果详情
			// rule_result_details 规则结果详情
			// reserve_field 保留字段
			// platfmId 合作平台id 百度 R0002
			nlsCreditInfoVo.setPlatfmid(BdLoanConstant.PLATFM_ID);
			// platfmUsrID 合作平台用户id 05渠道号+证件号码
			nlsCreditInfoVo.setPlatfmusrid(BdLoanConstant.BD_CHANNEL_NO + bdSxapplyBean.getPrcid());
			// refuse_cause 拒绝原因
			return nlsCreditInfoVo;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "nls_credit_info";
			String remark = "初始化授信申请信息表出错，授信申请流水号：" + bdSxapplyBean.getSessionid();
			String errorMsg = "初始化授信申请信息表出错，异常信息：" + e.getMessage();
			logger.error(errorMsg);
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			return null;
		}
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年5月7日 上午11:31:23:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月7日 上午11:31:23
	 * @date 2019年5月7日 上午11:31:23
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
